Skip to content

Add Kimi K2.6 NVFP4 B300 EAGLE3 AgentX benchmark / 新增 Kimi K2.6 NVFP4 B300 EAGLE3 AgentX 基准测试#2228

Merged
functionstackx merged 10 commits into
mainfrom
agent/reopen-pr-2158
Jul 16, 2026
Merged

Add Kimi K2.6 NVFP4 B300 EAGLE3 AgentX benchmark / 新增 Kimi K2.6 NVFP4 B300 EAGLE3 AgentX 基准测试#2228
functionstackx merged 10 commits into
mainfrom
agent/reopen-pr-2158

Conversation

@cquil11

@cquil11 cquil11 commented Jul 15, 2026

Copy link
Copy Markdown
Collaborator

Adds an EAGLE3 speculative-decoding AgentX (agentic-coding) benchmark for Kimi K2.6 NVFP4 on B300, served with upstream vLLM (vllm/vllm-openai:nightly-94c0ef30…).

Changes

  • New config kimik2.5-fp4-b300-vllm-agentic-mtp (configs/nvidia-master.yaml), runner cluster:b300-nv. Search space: TP8, TP4, TP4 + native CPU KV offload (SimpleCPUOffloadConnector, dram-utilization: 0.80), and TP4/DCP4 with and without offload at high concurrency.
  • New script benchmarks/single_node/agentic/kimik2.5_fp4_b300_mtp.sh: EAGLE3 draft lightseekorg/kimi-k2.6-eagle3.1-mla with simulated synthetic acceptance — non-DCP arms use num_speculative_tokens=4 / AL 3.24; DCP4 arms use num_speculative_tokens=3 / AL 2.88. TOKENSPEED_MLA attention backend, TRTLLM_RAGGED MLA prefill (non-DCP), fp8 KV cache.
  • Launcher: add Kimi-K2.6-NVFP4 to the b300-nv model allowlist.
  • Changelog tooling: process_changelog.py now emits JSON with exclude_none=True; perf-changelog entry added.

Validation


为 B300 上的 Kimi K2.6 NVFP4 新增 EAGLE3 投机解码 AgentX(agentic-coding)基准测试,使用上游 vLLM 镜像。新增 kimik2.5-fp4-b300-vllm-agentic-mtp 配置(TP8 / TP4 / TP4+CPU KV offload / TP4+DCP4 组合)、基准脚本(EAGLE3 草稿模型 lightseekorg/kimi-k2.6-eagle3.1-mla,非 DCP 使用 spec4/AL 3.24,DCP4 使用 spec3/AL 2.88)、b300-nv 模型白名单及 perf-changelog 条目。


Original PR: #2158

… Kimi K2.6 NVFP4 B300 EAGLE3 AgentX 基准测试 (#2158)" (#2227)"

This reverts commit bae2753.
@cquil11 cquil11 added NVIDIA full-sweep-enabled agentx AgentX benchmarks, recipes, and infrastructure labels Jul 15, 2026
@cquil11 cquil11 added the agentx AgentX benchmarks, recipes, and infrastructure label Jul 15, 2026
@github-actions

Copy link
Copy Markdown
Contributor

Thanks for the contribution! Please reach out to respective companies' CODEOWNER to fill in the latest PR_REVIEW_CHECKLIST.md before pinging core maintainer on Slack for review. In order for the signoff PR check bot to trigger, you must follow the PR_REVIEW_CHECKLIST.md template correctly, including the phrase As a PR reviewer and CODEOWNER, I have reviewed this and have.

For PR verification, add the full-sweep-fail-fast label (strongly recommended) to this PR — the benchmark sweep only runs on labeled PRs. Use full-sweep-enabled only if you need matrix jobs to keep running past a failure.

PR authors are responsible for ensuring that after merging, all GitHub Action jobs fully pass. A lot of the time, failures are just flakes and simply re-running the failed jobs will fix it. See GitHub's docs on re-running failed jobs


感谢你的贡献!请联系相应公司的 CODEOWNER 填写最新的 PR_REVIEW_CHECKLIST.md,然后再在 Slack 上联系核心维护者进行审阅。为了触发 signoff PR 检查机器人,你必须正确遵循 PR_REVIEW_CHECKLIST.md 模板,包括保留英文语句 As a PR reviewer and CODEOWNER, I have reviewed this and have

如需进行 PR 验证,请为此 PR 添加 full-sweep-fail-fast 标签(强烈推荐)— 基准测试 sweep 仅在带有标签的 PR 上运行。仅当需要矩阵任务在失败后继续运行时才使用 full-sweep-enabled

PR 作者有责任确保合并后所有 GitHub Action 任务完全通过。 很多时候失败只是偶发抖动(flake),重新运行失败的任务即可解决。参见 GitHub 关于重新运行失败任务的文档

@cquil11 cquil11 marked this pull request as ready for review July 15, 2026 19:23
@cquil11 cquil11 requested a review from a team July 15, 2026 19:23
@claude

claude Bot commented Jul 15, 2026

Copy link
Copy Markdown
Contributor

Claude finished @cquil11's task in 4m 43s —— View job


Review of PR #2228

  • Gather context (diff, changed files)
  • Review benchmark script kimik2.5_fp4_b300_mtp.sh
  • Review configs/nvidia-master.yaml (image accessibility, model prefix, changelog pairing)
  • Review perf-changelog.yaml (entry appended at end)
  • Review launcher and process_changelog.py changes
  • Post findings

Summary

One blocking issue found (see inline comment): the new perf-changelog.yaml entry is inserted in the middle of the file instead of appended to the end, and it duplicates the identical entry already at the bottom of the file from #2222 — an artifact of the revert-of-revert re-applying #2158's diff at its old position. Please move the entry to the end of the file (and consider pointing pr-link at this PR, as #2222 did).

Everything else checks out: the image is a public Docker Hub reference, Kimi-K2.6-NVFP4 is in the b300-nv pre-staged model list so MODEL_PATH resolves on the cluster, KV-offload env validation is handled by the benchmark_lib.sh agentic preamble, the enroot import pattern is already present in the launcher, and --use-chat-template does not apply here since agentic benchmarks use the aiperf trace-replay client rather than benchmark_client. The exclude_none=True change in process_changelog.py is covered by the changelog-gate test suite.

Fix this →

Comment thread perf-changelog.yaml Outdated
Comment on lines +4785 to +4790
- config-keys:
- kimik2.5-fp4-b300-vllm-agentic-mtp
description:
- "Add EAGLE3 speculative-decoding arm for the Kimi K2.6 NVFP4 B300 AgentX recipe (draft lightseekorg/kimi-k2.6-eagle3-mla, TOKENSPEED_MLA attention backend with TRT-LLM ragged MLA kernel)."
- "Add EAGLE3 speculative-decoding arm for the Kimi K2.6 NVFP4 B300 AgentX recipe (draft lightseekorg/kimi-k2.6-eagle3.1-mla, TOKENSPEED_MLA attention backend with TRT-LLM ragged MLA kernel)."
- "TP8/TP4 GPU-only KV points plus a TP4 native CPU-offload ladder via SimpleCPUOffloadConnector with lazy_offload off; TP4/DCP4 high-concurrency points (conc 32/64) using num_speculative_tokens=3 and synthetic_acceptance_length=2.88."
pr-link: https://github.com/SemiAnalysisAI/InferenceX/pull/2158

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔴 BLOCKING: New perf-changelog.yaml entry is inserted in the middle of the file, not appended to the end — and it is character-for-character identical to the entry that already sits at the end of the file (pr-link #2222).

Why it matters: The file is read chronologically (oldest at top, newest at bottom); inserting above existing entries breaks the append-only ordering convention. This happened mechanically because the revert-of-revert re-applied #2158's diff at its original position, while main has since gained the #2222 entry below it.

Fix: Move this entry to the very bottom of the file (below the #2222 entry). Since it re-lands the config, also consider pointing pr-link at this PR (#2228) rather than the original #2158 — that matches what #2222 did — and fixing the stale "(conc 32/64)" in the description, since the DCP4 arms now sweep conc 32–160.

Suggested change
- config-keys:
- kimik2.5-fp4-b300-vllm-agentic-mtp
description:
- "Add EAGLE3 speculative-decoding arm for the Kimi K2.6 NVFP4 B300 AgentX recipe (draft lightseekorg/kimi-k2.6-eagle3-mla, TOKENSPEED_MLA attention backend with TRT-LLM ragged MLA kernel)."
- "Add EAGLE3 speculative-decoding arm for the Kimi K2.6 NVFP4 B300 AgentX recipe (draft lightseekorg/kimi-k2.6-eagle3.1-mla, TOKENSPEED_MLA attention backend with TRT-LLM ragged MLA kernel)."
- "TP8/TP4 GPU-only KV points plus a TP4 native CPU-offload ladder via SimpleCPUOffloadConnector with lazy_offload off; TP4/DCP4 high-concurrency points (conc 32/64) using num_speculative_tokens=3 and synthetic_acceptance_length=2.88."
pr-link: https://github.com/SemiAnalysisAI/InferenceX/pull/2158

cquil11 commented Jul 15, 2026

Copy link
Copy Markdown
Collaborator Author

Comment on lines +87 to +107
echo "Starting vllm server..."
export PYTHONNOUSERSITE=1

export VLLM_FLASHINFER_ALLREDUCE_BACKEND=trtllm

{ set +x; } 2>/dev/null
VLLM_CMD=(
vllm serve "$MODEL_PATH" --served-model-name "$MODEL"
--host 0.0.0.0
--port "$PORT"
--kv-cache-dtype fp8
--trust-remote-code
--block-size 64
--language-model-only
--gpu-memory-utilization 0.90
--max-num-seqs "$CONC"
"${ATTN_BACKEND_ARGS[@]}"
--attention-config "$ATTN_CONFIG"
--compilation-config "$COMPILATION_CONFIG"
--max-cudagraph-capture-size 2048
--max-num-batched-tokens 16384

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔴 The new EAGLE3 MTP agentic script (kimik2.5_fp4_b300_mtp.sh) sets --language-model-only but never passes --tool-call-parser kimi_k2 or --reasoning-parser kimi_k2, unlike every other agentic vLLM script for this model family (e.g. kimik2.5_fp4_b300.sh:65-66, kimik2.5_fp4_b200.sh:175-176). Since this is a tool-calling AgentX benchmark, vLLM won't parse tool calls/reasoning content from the model's output during replay, which can break or invalidate the benchmark.

Extended reasoning...

The bug: benchmarks/single_node/agentic/kimik2.5_fp4_b300_mtp.sh builds its VLLM_CMD array (lines 87-107) with --language-model-only but omits --tool-call-parser kimi_k2 and --reasoning-parser kimi_k2. This script serves the model for an agentic-coding (tool-use) AgentX replay via build_replay_cmd / run_agentic_replay_and_write_outputs, which drives /v1/chat/completions requests against the inferencex-agentx-mvp tool-calling trace corpus.

Established pattern this diverges from: every sibling agentic vLLM script for a tool-calling model sets both parser flags. The closest sibling, kimik2.5_fp4_b300.sh:65-66 (same Kimi K2 family, same B300 SKU, same agentic-coding scenario, non-speculative variant of this exact recipe), sets --reasoning-parser kimi_k2 --tool-call-parser kimi_k2. kimik2.5_fp4_b200.sh:175-176 and the int4 Kimi variants do the same. Critically, minimaxm3_fp8_h100.sh:106,109-110 combines --language-model-only WITH --tool-call-parser minimax_m3 --reasoning-parser minimax_m3 (plus --enable-auto-tool-choice) — proving --language-model-only (which disables the vision tower / non-LM submodules) does not replace or preclude the tool-call/reasoning parser flags. The new MTP script appears to be a derivative of kimik2.5_fp4_b300.sh that dropped these two flags during the EAGLE3/DCP rework.

Why nothing else catches this: the script has no validation that parser flags are set when the scenario is agentic-coding; check_env_vars only checks that required env vars exist, not that the constructed VLLM_CMD includes tool/reasoning parsing. The server will start successfully and pass wait_for_server_ready regardless, so the omission is silent until requests carrying tools/tool_choice are replayed.

Impact: without --tool-call-parser kimi_k2, vLLM either (a) rejects tool_choice-bearing chat-completions requests outright, or (b) accepts them but never structures the model's tool-call text into tool_calls, degrading the trace replay into plain text completion. Since benchmark_lib.sh enforces a 10% failed-request threshold for the sweep, case (a) would push a tool-calling-heavy trace over that threshold and fail the run; case (b) would silently produce throughput numbers for a benchmark that no longer measures actual tool-calling behavior, defeating the purpose of the AgentX agentic-coding scenario this PR is adding.

Proof walkthrough:

  1. configs/nvidia-master.yaml registers kimik2.5-fp4-b300-vllm-agentic-mtp under the agentic-coding scenario.
  2. The sweep runner invokes kimik2.5_fp4_b300_mtp.sh, which launches vllm serve with the VLLM_CMD array shown in the diff — no --tool-call-parser/--reasoning-parser present, only --language-model-only.
  3. resolve_trace_source / build_replay_cmd configure aiperf to replay the inferencex-agentx-mvp corpus, which contains tool-definition-bearing chat-completions requests (this is what makes the scenario "agentic-coding" rather than plain chat).
  4. When aiperf sends a request with tools/tool_choice to a vLLM server started without a tool-call parser, vLLM either 400s the request or returns unparsed tool-call text as plain content, instead of populating tool_calls.
  5. Compare with kimik2.5_fp4_b300.sh (same model family, same replay path) which explicitly sets --reasoning-parser kimi_k2 --tool-call-parser kimi_k2 at lines 65-66 — confirming this is the required, intentional configuration for this exact benchmark type, not an optional flag that only some scripts happen to add.

Fix: add --tool-call-parser kimi_k2 and --reasoning-parser kimi_k2 to the VLLM_CMD array in kimik2.5_fp4_b300_mtp.sh, matching kimik2.5_fp4_b300.sh:65-66.

@github-actions

Copy link
Copy Markdown
Contributor

1 similar comment
@github-actions

Copy link
Copy Markdown
Contributor

@github-actions

Copy link
Copy Markdown
Contributor

@github-actions

Copy link
Copy Markdown
Contributor

@github-actions

Copy link
Copy Markdown
Contributor

1 similar comment
@github-actions

Copy link
Copy Markdown
Contributor

@github-actions

Copy link
Copy Markdown
Contributor

4 similar comments
@github-actions

Copy link
Copy Markdown
Contributor

@github-actions

Copy link
Copy Markdown
Contributor

@github-actions

Copy link
Copy Markdown
Contributor

@github-actions

Copy link
Copy Markdown
Contributor

@github-actions

Copy link
Copy Markdown
Contributor

1 similar comment
@github-actions

Copy link
Copy Markdown
Contributor

@Ankur-singh

Copy link
Copy Markdown
Collaborator

As a PR reviewer and CODEOWNER, I have reviewed this and have:

  • Verified that as of the moment of typing this, this is the latest version of PR_REVIEW_CHECKLIST.md
  • Verified that the general code quality meets the InferenceX standard and does not make the code quality any worse.
  • Verified that this PR has passed PR validation. GitHub Actions workflow
  • Verified that this PR passes evals. GitHub Actions workflow
  • Verified that speculative decoding PRs uses chat templates to align the AL distribution to real world
  • For agentic workloads: verified that speculative-decoding configs (EAGLE / MTP / draft models) run with simulated synthetic acceptance, with the acceptance-length value taken from the committed golden AL curve in golden_al_distribution/ for that model, thinking mode, and draft length. A submission may choose any supported draft length, but it may not substitute a different acceptance target.
  • Verified that the model architecture isn't changed with benchmark hacks like using --hf-overrides to skipping indexer for every x layers on models that don't natively support this. As a general rule, we won't accept optimizations that reduces the number of model architecture FLOPs. Anything that makes that same computation run faster is fair game; FLOPs at lower precisions is fine, given that the config passes private evals. As an general north star princple, we should only use optimizations which is used in production by customers that care about accuracy
  • If an company claims that they support vLLM/SGLang as first class LLM inference engines on their hardware, I have verified that the respective vLLM submission made using upstream https://hub.docker.com/u/vllm docker repo, upstream SGLang https://hub.docker.com/u/lmsysorg docker repo. The only exceptions are for new hardware, such as MI455X UALoE72, Vera Rubin NVL72, Rubin NVL8, etc., and for new model architectures where there is an actual reason why vLLM/SGLang does not fundamentally support them yet as supported by vLLM/SGLang community maintainers
  • If an company claims that they support vLLM/SGLang as first class upstream in-tree LLM inference engines on their hardware, I have have verified that the respective vLLM/SGLang submission has been made before additional frameworks (TRT-LLM, ATOM, etc.). The only exceptions are for new hardware, such as MI455X UALoE72, Vera Rubin NVL72, Rubin NVL8, etc., and for new model architectures where there is an actual reason why vLLM/SGLang does not fundamentally support them yet.
  • Verified that every single-node vLLM/SGLang recipe in this PR is documented in the official vLLM recipes and/or the SGLang cookbook:
    • I linked the corresponding upstream PR in the vLLM recipe repo or SGLang repo and verified that it is MERGED before this InferenceX PR merges. An opened, draft, or closed-without-merge upstream PR does not satisfy this requirement. If the matching recipe was already published, I linked the published recipe/cookbook page in the additional detail section below.
  • Verified that this PR does not patch the inference engine or serving stack — the pinned image must run as shipped. This covers .patch files / git apply / patch, inline patches embedded in benchmark scripts (e.g. a python3/sed heredoc that rewrites installed engine sources before serving), in-place edits of site-packages, monkey-patching, overwriting container files, and installing forked/rebuilt engine wheels on top of the pinned image. The only exception is a patch covered by a filled-out waiver at docs/waiver/<PR_NUMBER>.md — named after the PR that introduces the patch and filed in that same PR, stating what is patched, why the unmodified upstream image cannot run this benchmark, the upstream PR/issue link, and the removal plan — which I have linked below in the additional detail section.
  • If any of the above criteria cannot reasonably be satisfied, I have provided additional reasoning below.

Additional detail section:

Signed: Ankur-singh

@Klaud-Cold

Copy link
Copy Markdown
Collaborator

✅✅✅ Verdict: PASS ✅✅✅

✅ Check 0 (CODEOWNER): PASS — Ankur-singh is a listed owner of configs/nvidia-master.yaml (last-matching CODEOWNERS line); the other changed files carry only the catch-all, which a recognized CODEOWNER satisfies.
✅ Check 1 (green sweep on in-PR commit): PASS — head 38c7812 executed all 20 agentic / benchmark jobs with success in run 29506569772 (overall success, 20 bmk_agentic_* result artifacts — exactly what validate_reusable_run requires). single-node */ and eval / lanes were skipped because this PR adds an agentic-coding-only config.
➖ Check 2 (evals pass): N/A — the sweep defines no eval lane for agentic scenarios (agentic runs are validated via bmk_agentic_* artifacts); executed jobs pin this PR's exact image vllm/vllm-openai:nightly-94c0ef30….
✅ Check 3 (recipe merged & matches): PASS — vllm-project/recipes#634 is MERGED (2026-07-15) and documents the major args: nvidia/Kimi-K2.6-NVFP4 on B300, TP4 + DCP4, fp8 KV cache, TOKENSPEED_MLA + TRTLLM_RAGGED prefill with query quantization, the compilation config, EAGLE3 spec decoding at 3/4 draft tokens, and native SimpleCPUOffloadConnector offload with lazy_offload: false. Informational only: the PR's draft is kimi-k2.6-eagle3.1-mla vs the recipe's kimi-k2.6-eagle3-mla (immaterial under golden-AL synthetic acceptance), and synthetic-acceptance knobs / GMU / batched-token / stream-interval settings are InferenceX harness tuning.
✅ Check 4 (reuse command): PASS — /reuse-sweep-run posted by xinli-sw (COLLABORATOR).
✅ Check 5 (latest checklist): PASS — every current-template item is present; the one unchecked item (agentic golden AL) is explained in the additional detail section, as the template's escape hatch allows.
✅ Check 6 (upstream image / engine-first): PASS — vllm/vllm-openai:nightly-94c0ef30… is from the upstream vLLM Docker Hub org on established B300; framework is vLLM itself, so engine-first ordering is inherently satisfied.
✅ Check 7 (no architecture hacks): PASS — no --hf-overrides or model-config edits; --language-model-only only skips the unused vision encoder on a text-only workload and is documented upstream as the recipe's text_only feature.
✅ Check 8 (spec decode via chat template): PASS — the agentic replay client drives /v1/chat/completions with --endpoint-type chat (benchmark_lib.sh).
✅ Check 9 (no engine patches): PASS — no patch files, heredoc rewrites, or engine reinstalls; only client-side aiperf/benchmark deps installed into an isolated venv separate from the server's site-packages.
✅ Check 10 (agentic golden AL): PASS — both arms pin synthetic acceptance (rejection_sample_method: synthetic; spec4 → AL 3.24, DCP4/spec3 → AL 2.88), and no synthetic knobs appear outside agentic configs. Kimi K2.6 has no committed golden curve yet; the sign-off states the source as required — the committed Kimi K2.5 EAGLE3 thinking_on curve (golden_al_distribution/kimik2.5_eagle3.yaml), whose values at draft lengths 4 and 3 match exactly. Follow-up (non-blocking): collect and commit a model-specific K2.6 golden curve.

@functionstackx functionstackx left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

lgtm

@functionstackx functionstackx merged commit 804c6b4 into main Jul 16, 2026
25 checks passed
@functionstackx functionstackx deleted the agent/reopen-pr-2158 branch July 16, 2026 21:45
@SemiAnalysisAI SemiAnalysisAI deleted a comment from functionstackx Jul 16, 2026
@SemiAnalysisAI SemiAnalysisAI deleted a comment from xinli-sw Jul 16, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

agentx AgentX benchmarks, recipes, and infrastructure full-sweep-enabled NVIDIA

Projects

Development

Successfully merging this pull request may close these issues.

5 participants